home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
C/C++ Users Group Library 1996 July
/
C-C++ Users Group Library July 1996.iso
/
listings
/
v_12_08
/
treu
/
bgigrh.c
< prev
next >
Wrap
C/C++ Source or Header
|
1994-04-25
|
4KB
|
167 lines
/******************************************************
* BGIGRH.C - required graphics functions
* using Borland Graphic Interface
*
* The routines in this module adapt themselves to
* whatever video hardware a driver is available for.
*
* for TurboC V2.0
*
* by Anton Treuenfels
*
* first created: 01/01/93
* last revision: 04/11/94
*****************************************************/
/*****************************
* Header Section - BGIGRH.H *
*****************************/
#ifndef SEEN_BGIGRH
#define SEEN_BGIGRH
/* exported variables */
extern long MaxXPos, MaxYPos;
extern int MaxColor;
/* function prototypes */
void abspoint(int *, int *);
void grhopen(void);
void grhclose(void);
void grhfpair(int, int, int, int);
void grhrect(int, int, int, int);
void grhcircle(int, int, int, int);
#endif
/***************************
* Code Section - BGIGRH.C *
***************************/
#include <stdio.h>
#include <stdlib.h>
#include <graphics.h>
#include "usrdef.h"
/* change the following definition if the driver
files are not there or in the current directory */
#define DRIVERPATH "C:\\TURBOC\\BGI"
long MaxXPos, MaxYPos; /* physical screen size */
int MaxColor; /* maximum color index */
/*****************************************************/
/* convert relative point to absolute */
void abspoint(int *xpos, int *ypos) {
if (*xpos <= 0)
*xpos = 0;
else if (*xpos >= 100)
*xpos = (int)MaxXPos;
else
*xpos = (int)(*xpos * MaxXPos / 100);
if (*ypos <= 0)
*ypos = 0;
else if (*ypos >= 100)
*ypos = (int)MaxYPos;
else
*ypos = (int)(*ypos * MaxYPos / 100);
}
/* convert relative rectangle to absolute */
static void absrect(int *lft, int *top,
int *rgt, int *bot) {
int tmp;
if (*lft > *rgt) {
tmp = *lft; *lft = *rgt; *rgt = tmp;
}
if (*top > *bot) {
tmp = *top; *top = *bot; *bot = tmp;
}
abspoint(lft, top);
abspoint(rgt, bot);
}
/* init bitmapped graphics operations */
void grhopen(void) {
int gdriver, gmode, gerror;
gdriver = DETECT;
initgraph(&gdriver, &gmode, DRIVERPATH);
gerror = graphresult();
if (gerror < 0) {
printf("\ngraphics error: %s.\n",
grapherrormsg(gerror));
exit(EXIT_FAILURE);
}
MaxXPos = getmaxx();
MaxYPos = getmaxy();
MaxColor = getmaxcolor();
setcolor(MaxColor);
setbkcolor(0);
}
/* end bitmapped graphics operations */
void grhclose(void) {
closegraph();
}
/* draw sideways 'F' pair */
void grhfpair(int lft, int top, int rgt, int bot) {
int dx, dy, dx2, dx3, dy3;
setlinestyle(SOLID_LINE, 0x0000, NORM_WIDTH);
absrect(&lft, &top, &rgt, &bot);
dx = (rgt - lft + 1) / 7;
dy = (bot - top + 1) / 5;
dx2 = 2 * dx; dx3 = 3 * dx; dy3 = 3 * dy;
rectangle(lft, top, rgt, top + dy);
rectangle(lft, bot - dy, rgt, bot);
rectangle(rgt - dx, top + dy, rgt, top + dy3);
rectangle(lft, bot - dy3, lft + dx, bot - dy);
rectangle(lft + dx2, top + dy,
lft + dx3, top + dy3);
rectangle(rgt - dx3, bot - dy3,
rgt - dx2, bot - dy);
}
/* draw rectangle */
void grhrect(int lft, int top, int rgt, int bot) {
setlinestyle(SOLID_LINE, 0x0000, NORM_WIDTH);
absrect(&lft, &top, &rgt, &bot);
rectangle(lft, top, rgt, bot);
}
/* draw circle */
void grhcircle(int lft, int top, int rgt, int bot) {
int radius;
setlinestyle(SOLID_LINE, 0x0000, NORM_WIDTH);
absrect(&lft, &top, &rgt, &bot);
radius = min((rgt - lft)/2, (bot - top)/2);
circle((lft + rgt)/2, (top + bot)/2, radius);
}